package com.tao.design.factory

/**
 *
 * @ProjectName:    lab
 * @Package:        com.tao.design.factory
 * @ClassName:      Factory
 * @Description:     java类作用描述
 * @Author:         wangxf
 * @CreateDate:     2022/4/25 9:35
 * @UpdateUser:     更新者
 * @UpdateDate:     2022/4/25 9:35
 * @UpdateRemark:   更新说明
 * @Version:        1.0
 */

/**
 * 两个 出发点 客户端（商店） 工厂 、 产品 、 原料
 *
 * 准则 ： 不能让高层组件依赖底层组件  高层和底层 都应该依赖抽象
 *
 * 变量不可以持有具体类的引用
 * 不能让类派生自具体类
 * 不要覆盖基类中的具体方法
 *
 * 工厂让类的实现推迟到子类
 *
 *
 * 抽象工厂和普通工厂  抽象工厂 创建的产品是 原料 不同的原料可以构成 最后的产品  而工厂 创建的产品是 单一的产品
 *
 * 抽象工厂 使用工厂模式 实现生产方法
 *
 * 摘录：抽象工厂允许 客户使用抽象的接口创建一组相关产品  而不需要知道实际产出的具体产品是什么
 */
/**
 * 包含将各种原料 组合起来
 *
 * eg: 不同pizza商店制作不同口味的pizza
 */
abstract class Creator {
    abstract fun ingredientA(): IngredientA
    abstract fun ingredientB(): IngredientB

}

abstract class Product {
    abstract fun prepare()

}

abstract class Store {
    abstract fun createProduct(type: String): Product?

}

class ConcreteStoreA : Store() {
    override fun createProduct(type: String): Product? {
        var product: Product? = null;

        //产品工厂类
        val create = ConcreteCreatorA();

        when (type) {
            "def" -> {
                product = ConcreteProductA(create);
            }
        }
        return product

    }
}


class ConcreteProductA(val creator: ConcreteCreatorA) : Product() {

    override fun prepare() {
        val a = creator.ingredientA();
        val b = creator.ingredientB();
    }
}

/**
 *
 */
class ConcreteCreatorA : Creator() {
    override fun ingredientA(): IngredientA {
        return IngredientA()
    }

    override fun ingredientB(): IngredientB {
        return IngredientB()
    }


}

//原料1
class IngredientA {

}
//原料2
class IngredientB {

}